/**
 * @file motor.c
 * @brief 电机驱动实现
 * @author 废话文学创始人
 * @version 1.0
 * @date 2024-07-14
 */

#include <motor.h>
#include <stdlib.h>

/**
 * @brief 电机初始化
 * @note 打开PWM通道，使电机处于不转动状态
 */
void Motor_init(void)
{
    HAL_GPIO_WritePin(AIN1_GPIO_Port, AIN1_Pin, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(AIN2_GPIO_Port, AIN2_Pin, GPIO_PIN_RESET);
    HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
}

/**
 * @brief 设置电机的PWM值
 * @param pwm PWM值（正数：顺时针，负数：逆时针）
 * @note PWM绝对值小于PWM_CAN_NOT_MOVE时电机不动作，超过ARR时限幅
 */
void Motor_set_PWM(int pwm)
{
    if (pwm >= 0)
    {
        HAL_GPIO_WritePin(AIN1_GPIO_Port, AIN1_Pin, GPIO_PIN_RESET);
        HAL_GPIO_WritePin(AIN2_GPIO_Port, AIN2_Pin, GPIO_PIN_SET);
    }
    else
    {
        HAL_GPIO_WritePin(AIN1_GPIO_Port, AIN1_Pin, GPIO_PIN_SET);
        HAL_GPIO_WritePin(AIN2_GPIO_Port, AIN2_Pin, GPIO_PIN_RESET);
    }

    // 输出限幅
    if (abs(pwm) >= htim2.Instance->ARR)
        __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, htim2.Instance->ARR);
    else if (abs(pwm) <= PWM_CAN_NOT_MOVE)
        __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 0);
    else
        __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, abs(pwm));
}